'''
@Company: TWL
@Author: xue jian
@Email: xuejian@kanzhun.com
@Date: 2020-07-14 09:15:17
'''
'''
120. 三角形最小路径和
给定一个三角形，找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。

 

例如，给定三角形：

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]
自顶向下的最小路径和为 11（即，2 + 3 + 5 + 1 = 11）。
'''
'''
tips:动态规划，dp[i][j]记录三角形位置i，j时路径最小值。只能从上面可能的两个点转移过来。
'''

from typing import List

class Solution:
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        import sys
        dp = [[sys.maxsize for _ in i] for i in triangle]
        dp[0][0] = triangle[0][0]
        # if len(triangle) == 1:
        #     return dp[0][0]
        for i in range(1, len(dp)):
            for j in range(len(dp[i])):
                if j<len(triangle[i-1]):
                    dp[i][j] = min(dp[i][j], dp[i-1][j]+triangle[i][j])
                if j>0:
                    dp[i][j] = min(dp[i][j], dp[i-1][j-1]+triangle[i][j])
        return min(dp[-1])

if __name__ == "__main__":
    solution = Solution()
    triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
    print(solution.minimumTotal(triangle))